#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
飞机费用报销分析脚本

此脚本用于分析科级及以下人员的飞机费用超标报销情况。
只分析包含"飞机"关键词的交通工具记录且超标的记录。
"""

import pandas as pd
from pathlib import Path

# 配置常量
DATA_DIR = Path("data")
OUTPUT_DIR = DATA_DIR / "alldata"  # 输出目录
TRAVEL_DETAIL_FILE = DATA_DIR / "差旅报销行程明细(商旅).xlsx"
TRANSPORT_FEE_FILE = DATA_DIR / "差旅费城市间交通费.xlsx"
OUTPUT_FILE = OUTPUT_DIR / "科级及以下人员飞机费用超标分析结果.xlsx"

def clean_amount(amount):
    """
    清理并转换金额数据为浮点数
    
    Args:
        amount: 原始金额数据，可能是字符串、数字或NaN
        
    Returns:
        float: 清理后的金额数值
    """
    if pd.isna(amount):
        return 0.0
    if isinstance(amount, str):
        # 移除逗号和空格
        cleaned_amount = amount.replace(",", "").strip()
        try:
            return float(cleaned_amount)
        except ValueError:
            return 0.0
    return float(amount)

def ensure_column_types(df):
    """
    确保关键列的数据类型正确
    
    Args:
        df (pd.DataFrame): 输入数据框
        
    Returns:
        pd.DataFrame: 处理后的数据框
    """
    # 确保唯一标识和员工编号为字符串类型
    if '唯一标识' in df.columns:
        df['唯一标识'] = df['唯一标识'].astype(str)
    if '员工编号' in df.columns:
        df['员工编号'] = df['员工编号'].astype(str)
    return df

def filter_records(df):
    """
    筛选符合条件的记录
    
    Args:
        df (pd.DataFrame): 原始数据框
        
    Returns:
        pd.DataFrame: 筛选后的数据框
    """
    # 筛选科级及以下人员
    staff_mask = df['报销级别名称'] == '科级及以下人员'
    
    # 筛选包含"飞机"关键词的交通工具
    flight_mask = df['交通工具名称'].str.contains('飞机', na=False)
    
    # 筛选超标记录
    excess_mask = df['是否超标'] == '超标'
    
    # 组合筛选条件
    final_mask = staff_mask & flight_mask & excess_mask
    
    return df[final_mask]

def main():
    """主程序入口"""
    try:
        # 确保输出目录存在
        OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
        
        # 读取数据文件
        print("正在读取数据文件...")
        travel_details = pd.read_excel(TRAVEL_DETAIL_FILE, engine='openpyxl')
        transport_fees = pd.read_excel(TRANSPORT_FEE_FILE, engine='openpyxl')
        
        # 数据预处理
        print("正在处理数据...")
        travel_details = travel_details.rename(columns={"人员编号": "员工编号"})
        transport_fees.loc[:, "含税金额"] = transport_fees["含税金额"].apply(clean_amount)
        transport_fees = transport_fees[transport_fees["含税金额"] > 0]
        
        # 确保数据类型一致
        travel_details = ensure_column_types(travel_details)
        transport_fees = ensure_column_types(transport_fees)
        
        # 合并数据
        merged_data = pd.merge(
            transport_fees,
            travel_details[["唯一标识", "员工编号", "报销级别", "报销级别名称"]],
            on=["唯一标识", "员工编号"],
            how="left"
        ).drop_duplicates()
        
        # 筛选数据
        filtered_data = filter_records(merged_data)
        
        # 保存结果
        filtered_data.to_excel(OUTPUT_FILE, index=False, engine='openpyxl')
        print(f"\n分析完成，结果已保存至: {OUTPUT_FILE}")
        print(f"总记录数: {len(filtered_data)}")
        
    except Exception as e:
        print(f"处理过程中出现错误: {str(e)}")
        raise

if __name__ == "__main__":
    main() 